package Class::Scaffold::HierarchicalDirty;

use strict;
use warnings;

# $Id: HierarchicalDirty.pm 13653 2007-10-22 09:11:20Z gr $
#
# Mixin that multiplexes the dirty flag among its subobjects using
# Class::Accessor::FactoryTyped's introspection support


our $VERSION = '0.03';


sub dirty {
    my $self = shift;

    for my $attr (Class::Scaffold::Accessor->factory_typed_accessors) {
        return 1 if $self->$attr->dirty;
    }

    for my $attr (Class::Scaffold::Accessor->factory_typed_array_accessors) {
        for my $element ($self->$attr) {
            return 1 if $element->dirty;
        }
    }

    return 0;
}


sub set_dirty {
    my $self = shift;

    $self->$_->set_dirty for
        Class::Scaffold::Accessor->factory_typed_accessors;

    for my $attr (Class::Scaffold::Accessor->factory_typed_array_accessors) {
        for my $element ($self->$attr) {
            $element->set_dirty;
        }
    }
}


sub clear_dirty {
    my $self = shift;

    $self->$_->clear_dirty for
        Class::Scaffold::Accessor->factory_typed_accessors;

    for my $attr (Class::Scaffold::Accessor->factory_typed_array_accessors) {
        for my $element ($self->$attr) {
            $element->clear_dirty;
        }
    }
}


1;


__END__

{% USE p = PodGenerated %}

=head1 NAME

{% p.package %} - large-scale OOP application support

=head1 SYNOPSIS

    {% p.package %}->new;

=head1 DESCRIPTION

=head1 METHODS

=over 4

{% p.write_methods %}

=back

{% p.write_inheritance %}

{% PROCESS standard_pod %}

=cut

